<?php
declare(strict_types=1);

namespace LowCode\Naive;

use LowCode\Naive;
use LowCode\Support\Js;
use LowCode\Support\JsExp;
use LowCode\Traits\HasDeprecatedChildren;
use LowCode\Traits\Props\HasColor;
use LowCode\Traits\Props\HasValue;

/**
 * 二维码 QrCode
 * @method static static make(string $text) 二维码 QrCode
 */
class QrCode extends Naive
{
    use HasColor, HasValue, HasDeprecatedChildren;

    public function __construct(string $text)
    {
        parent::__construct();
        $this->value($text);
    }

    /**
     * 二维码大小
     * @param mixed $value
     * @return $this
     */
    public function size(int|JsExp $value = 100): static
    {
        return $this->prop('size', $value);
    }


    /**
     * 自定义二维码渲染类型
     * @param string|JsExp $type 'canvas' | 'svg'
     * @return $this
     */
    public function type(string|JsExp $type = 'canvas' | 'svg'): static
    {
        return $this->prop('type', $type);
    }

    /**
     * 二维码canvas渲染类型
     * @return $this
     */
    public function canvas(): static
    {
        return $this->type('canvas');
    }

    /**
     * 二维码canvas渲染类型
     * @return $this
     */
    public function svg(): static
    {
        return $this->type('svg');
    }

    /**
     * 二维码填充大小
     * @param int|string|JsExp $value
     * @return $this
     */
    public function padding(int|string|JsExp $value = 12): static
    {
        return $this->prop('padding', $value);
    }

    /**
     * 二维码背景颜色，值需要采用 hex 格式 如: #FFF
     * @param string|JsExp $value
     * @return $this
     */
    public function backgroundColor(string|JsExp $value): static
    {
        return $this->prop('background-color', $value);
    }

    /**
     * 二维码纠错级别
     * @param string|JsExp $value
     * @return $this
     */
    public function errorLevel(string|JsExp $value = 'L' | 'M' | 'Q' | 'H'): static
    {
        return $this->prop('error-correction-level', $value);
    }

    /**
     * 图标背景颜色
     * @param string|JsExp $value
     * @return $this
     */
    public function iconBackgroundColor(string|JsExp $value): static
    {
        return $this->prop('icon-background-color', $value);
    }

    /**
     * 图标背景圆角大小
     * @param int|JsExp $value
     * @return $this
     */
    public function iconBorderRadius(int|JsExp $value = 4): static
    {
        return $this->prop('icon-border-radius', $value);
    }

    /**
     * 图标大小
     * @param int|JsExp $value
     * @return $this
     */
    public function iconSize(int|JsExp $value = 40): static
    {
        return $this->prop('icon-size', $value);
    }

    /**
     * 图标地址
     * @param string|JsExp $value
     * @return $this
     */
    public function iconSrc(string|JsExp $value): static
    {
        return $this->prop('icon-src', $value);
    }

    public static function download(string $refKey, string $filename = "QRCode.png"): string
    {
        $canvasRef = Js::refs("$refKey.canvasRef");
        return "() => { this.\$libs.downloadFromCanvas($canvasRef, '$filename') }";
    }

}
